package main

import (
	"fmt"
)

func main() {

	// 循环的三种模式
	//testForThreeModel()

	// for-each range 循环
	testForEachRange()

	// break跳出循环
	testForBreak()

	// goto 跳出循环
	testForGoTo()
}

/*
	for 循环 goto语句
*/
func testForGoTo() {
	var a int = 10
loop:
	for a < 20 {
		if a == 15 {
			a += 1
			goto loop
		}
		fmt.Printf("a的值为 : %d\n", a)
		a++
	}
}

/*
	break跳出循环
*/
func testForBreak() {
	// 不使用标记
	fmt.Println("---- break ----")
	for i := 1; i <= 3; i++ {
		fmt.Printf("i: %d\n", i)
		for i2 := 11; i2 <= 13; i2++ {
			fmt.Printf("i2: %d\n", i2)
			break
		}
	}

	// 使用标记
	fmt.Println("---- break label ----")
re:
	for i := 1; i <= 3; i++ {
		fmt.Printf("i: %d\n", i)
		for i2 := 11; i2 <= 13; i2++ {
			fmt.Printf("i2: %d\n", i2)
			break re
		}
	}
}

/*
	for-each range 循环
	这种格式的循环可以对字符串、数组、切片等进行迭代输出元素。
*/
func testForEachRange() {
	// For-each range 循环
	// 这种格式的循环可以对字符串、数组、切片等进行迭代输出元素。
	strings := []string{"google", "baidu"}
	for i, s := range strings {
		fmt.Println(i, s)
	}
}

/*
	循环的三种模式
*/
func testForThreeModel() {
	// init： 一般为赋值表达式，给控制变量赋初值；
	// condition： 关系表达式或逻辑表达式，循环控制条件；
	// post： 一般为赋值表达式，给控制变量增量或减量。

	// for init; condition; post { }
	sum := 0
	for i := 0; i <= 10; i++ {
		sum += i
	}
	fmt.Println(sum)

	// for condition { }
	for sum < 100 {
		fmt.Println("模仿 while 循环，无限循环。")
	}

	// for { }
	for {
		fmt.Println("无线循环")
	}
}
